#!/usr/bin/env python3
# -*- coding: utf-8 -*-

# this lesson is based on python 3

# 我们编写的Python代码会调用内置的Tkinter，Tkinter封装了访问Tk的接口；
# Tk是一个图形库，支持多个操作系统，使用Tcl语言开发；
# Tk会调用操作系统提供的本地GUI接口，完成最终的GUI。
# 所以，我们的代码只需要调用Tkinter提供的接口就可以了。
from tkinter import *
import tkinter.messagebox as messagebox
# 从Frame派生一个Application类，这是所有Widget的父容器
# 在GUI中，每个Button、Label、输入框等，都是一个Widget。Frame则是可以容纳其他Widget的Widget，所有的Widget组合起来就是一棵树
class Application(Frame):
    def __init__(self, master=None):
        Frame.__init__(self, master)
        self.pack() # pack()方法把Widget加入到父容器中，并实现布局。pack()是最简单的布局，grid()可以实现更复杂的布局。
        self.createWidgets()
    
    def createWidgets(self): # 在createWidgets()方法中，我们创建一个Label和一个Button
        self.helloLabel = Label(self, text='Hello, world!') # Label显示文本
        self.helloLabel.pack()
        self.nameInput = Entry(self) # Entry是输入框
        self.nameInput.pack()
        self.alertButton = Button(self, text='Hello', command=self.hello)
        self.alertButton.pack() # 当Button被点击时，触发self.hello()
        self.quitButton = Button(self, text='Quit', command=self.quit) # 当Button被点击时，触发self.quit()使程序退出
        self.quitButton.pack()

    def hello(self):
        name = self.nameInput.get() or 'world' # 获得用户输入的文本
        messagebox.showinfo('Message', 'Hello, %s'% name) # 弹出消息对话框

app = Application() # 实例化
app.master.title('Hello World') # 设置窗口标题
app.mainloop() # 主消息循环
# GUI程序的主线程负责监听来自操作系统的消息，并依次处理每一条消息。因此，如果消息处理非常耗时，就需要在新线程中处理


# 海龟绘图（Turtle Graphics）被移植到各种高级语言中，Python内置了turtle库，基本上100%复制了原始的Turtle Graphics的所有功能。
# 我们来看一个指挥小海龟绘制一个长方形的简单代码：
from turtle import *

width(4) # 设置笔刷宽度
forward(200) # 前进
right(90) # 右转90度
pencolor('red') # 笔刷颜色
forward(100)
right(90)
pencolor('green')
forward(200)
right(90)
pencolor('blue')
forward(100)
right(90)

done() # 调用done()使得窗口等待被关闭，否则将立刻关闭窗口。否则，由于Python进程会立刻结束，将导致窗口被立刻关闭

# 通过循环绘制5个五角星
def drawStar(x, y):
    pu() # pen up
    goto(x, y)
    pd() # pen down
    seth(0) # set heading: 0
    for i in range(5):
        fd(40) # forward
        rt(144) # right

for x in range(0, 250, 50): # 0 50 100 150 200
    drawStar(x, 0)

done()

# 绘制一棵分型树
colormode(255) # 设置色彩模式是RGB
lt(90) # left
lv = 10
l = 120 # length of line
s = 45
width(lv) # 设置笔刷宽度=14

# 初始化RGB颜色:
r = 0
g = 0
b = 0
pencolor(r, g, b) # 笔刷颜色

pu()
bk(l) # back=120
pd()
fd(l)

def drawTree(l, level):
    global r, g, b
    w = width() # save the current pen width
    width(w*0.75) # narrow the pen width
    r, g, b = r+1, g+2, b+3
    pencolor(r % 200, g % 200, b % 200)
    l = 0.75*l # shorter the line
    lt(s)
    fd(l)
    if level < lv:
        drawTree(l, level+1)
    bk(l)
    rt(2*s)
    fd(l)
    if level < lv:
        drawTree(l, level+1)
    bk(l)
    lt(s)
    width(w) # restore the previous pen width

speed('fastest')
drawTree(l, 4)
done()


